

#ifndef MPPT_INCC_I_F_H_
#define MPPT_INCC_I_F_H_
#include "MY_INC/TI_SOLAR/Solar_F.h"
//*********** Structure Definition ********//
typedef struct
{
    float32 Ipv;      // 当前光伏电流测量值
    float32 Vpv;      // 当前光伏电压测量值
    float32 IpvH;     // 电流变化上限阈值（未启用）
    float32 IpvL;     // 电流变化下限阈值（未启用）
    float32 VpvH;     // 电压变化上限阈值（未启用）
    float32 VpvL;     // 电压变化下限阈值（未启用）
    float32 MaxI;     // 最大允许输出电流限制
    float32 MinI;     // 最小允许输出电流限制
    float32 Stepsize; // 电流调整步长
    float32 ImppOut;  // MPPT算法输出的目标电流
    // 内部变量
    float32 Cond;        // 当前电导值（I/V）
    float32 IncCond;     // 电导增量（ΔI/ΔV）
    float32 DeltaV;      // 电压变化量（当前V - 历史V）
    float32 DeltaI;      // 电流变化量（当前I - 历史I）
    float32 VpvOld;      // 上一周期电压值
    float32 IpvOld;      // 上一周期电流值
    float32 StepFirst;   // 初始步长（启动时使用）
    Uint8   mppt_enable; // MPPT使能标志位（1=启用）
    Uint8   mppt_first;  // 首次运行标志位（初始化用）
} MPPT_INCC_I_F;         // 结构体命名
// 电导增量法核心参数

typedef MPPT_INCC_I_F *MPPT_INCC_I_handle; // 结构体指针类型定义

//*********** Function Declarations *******//
void MPPT_INCC_I_F_init(MPPT_INCC_I_F *v); // 初始化函数声明
void MPPT_INCC_I_F_FUNC(MPPT_INCC_I_F *v); // 算法执行函数声明

//*********** Macro Definition ***********//
//适用于电流型电导增量法
static inline void MPPT_INCC_I_F_MACRO(MPPT_INCC_I_F* v) // 核心算法宏定义（展开式实现）
{
    if (v->mppt_enable == 1) // MPPT模式使能检查
    {
        if (v->mppt_first == 1) // 首次运行初始化
        {
            v->ImppOut = v->Ipv + v->StepFirst; // 初始电流设定（启动步长）
            v->VpvOld = v->Vpv;                // 记录初始电压
            v->IpvOld = v->Ipv;                // 记录初始电流
            v->mppt_first = 0;                // 清除首次运行标志
        }
        else // 非首次运行
        {
            v->DeltaV = v->Vpv - v->VpvOld; // 计算电压变化量（ΔV）
            v->DeltaI = v->Ipv - v->IpvOld; // 计算电流变化量（ΔI）

            /* 被注释的容差检查（原设计可能用于滤波）*/
            // if(v->DeltaV <v->VpvH && v->DeltaV >-v->VpvL ) v->DeltaV=0;
            // if(v->DeltaI <v->IpvH && v->DeltaI >-v->IpvL ) v->DeltaI=0;

            if (v->DeltaV >= 0.0f) // 电压变化非负时
            {
                if (v->DeltaI != 0.0f) // 电流有变化
                {
                    if (v->DeltaI > 0.0f)                   // 电流增加时
                        v->ImppOut = v->Ipv - v->Stepsize; // 减小目标电流（试探方向）
                    else
                        v->ImppOut = v->Ipv + v->Stepsize; // 增加目标电流
                }
            }
            else // 电压变化为负时
            {
                v->Cond = v->Ipv / (v->Vpv);          // 计算电导值（I/V，__einvf32为快速倒数计算）
                v->IncCond = v->DeltaI  / (v->DeltaV); // 计算ΔI/ΔV（电导增量）

                if (v->IncCond != v->Cond) // 电导变化检测
                {
                    if (v->IncCond > (-v->Cond))          // 判断工作点位置：左侧MPP
                        v->ImppOut = v->Ipv - v->Stepsize; // 增加电压（通过减小电流）
                    else                                // 右侧MPP
                        v->ImppOut = v->Ipv + v->Stepsize; // 减小电压（通过增加电流）
                }
            }
            // 输出电流限幅保护
            v->ImppOut = (v->ImppOut < v->MinI) ? v->MinI : v->ImppOut; // 下限钳位
            v->ImppOut = (v->ImppOut > v->MaxI) ? v->MaxI : v->ImppOut; // 上限钳位
            // 更新历史值
            v->VpvOld = v->Vpv; // 存储当前电压供下次使用
            v->IpvOld = v->Ipv; // 存储当前电流供下次使用
        }
    }
}

#endif /*MPPT_INCC_I_F_H_*/